//package com.generator.rate.service;
//
//
//import com.iflytek.fsp.shield.java.sdk.exception.SdkClientException;
//import com.iflytek.fsp.shield.java.sdk.model.ApiResponse;
//import com.iflytek.fsp.shield.java.sdk.util.Native2AsciiUtils;
//import org.apache.commons.codec.binary.Base64;
//import org.apache.commons.lang3.StringUtils;
//import org.apache.http.Header;
//import org.apache.http.HttpResponse;
//import org.apache.http.NameValuePair;
//import org.apache.http.client.ClientProtocolException;
//import org.apache.http.client.config.RequestConfig;
//import org.apache.http.client.entity.EntityBuilder;
//import org.apache.http.client.methods.CloseableHttpResponse;
//import org.apache.http.client.methods.HttpUriRequest;
//import org.apache.http.client.methods.RequestBuilder;
//import org.apache.http.client.utils.URIBuilder;
//import org.apache.http.config.Registry;
//import org.apache.http.config.RegistryBuilder;
//import org.apache.http.conn.socket.ConnectionSocketFactory;
//import org.apache.http.conn.socket.PlainConnectionSocketFactory;
//import org.apache.http.entity.ContentType;
//import org.apache.http.impl.client.CloseableHttpClient;
//import org.apache.http.impl.client.HttpClientBuilder;
//import org.apache.http.impl.conn.PoolingHttpClientConnectionManager;
//import org.apache.http.message.BasicNameValuePair;
//import org.apache.http.util.EntityUtils;
//import org.springframework.util.CollectionUtils;
//
//import javax.crypto.Mac;
//import javax.crypto.spec.SecretKeySpec;
//import java.io.IOException;
//import java.io.UnsupportedEncodingException;
//import java.net.URI;
//import java.net.URISyntaxException;
//import java.nio.charset.Charset;
//import java.util.*;
//import java.util.Map.Entry;
//
//public class RequestTest {
//
//
//    private String authAppId = "xxxxx";
//    private String authAppSecret = "xxxxx";
//    private String host = "open.jyyun.com";
//    private int port = 80;
//
//    /**
//     * getHttpClient：(生成http请求客户端)
//     *
//     * @author
//     * @return
//     */
//    private CloseableHttpClient getHttpClient() {
//        HttpClientBuilder builder = HttpClientBuilder.create();
//
//        RegistryBuilder<ConnectionSocketFactory> registryBuilder = RegistryBuilder.create();
//        Registry<ConnectionSocketFactory> registry =
//                registryBuilder.register("http", PlainConnectionSocketFactory.getSocketFactory())
//                        .build();
//
//        PoolingHttpClientConnectionManager connectionManager =
//                new PoolingHttpClientConnectionManager(registry);
//        connectionManager.setMaxTotal(5);
//        connectionManager.setDefaultMaxPerRoute(5);
//        builder.setConnectionManager(connectionManager);
//
//        RequestConfig defaultConfig =
//                RequestConfig.custom().setConnectTimeout(6000).setSocketTimeout(6000)
//                        .setConnectionRequestTimeout(6000).build();
//        builder.setDefaultRequestConfig(defaultConfig);
//
//        CloseableHttpClient httpClient = builder.build();
//        return httpClient;
//    }
//
//    /**
//     * syncRequest：(发送请求)
//     *
//     * @author
//     * @param httpMethod 请求方法，支持GET、POST、PUT、PATCH、DELETE、HEAD，目前传POST方法就行
//     * @param apiName 接口名称，以 "/" 开头，比如 /getUserByUserId
//     * @param params 请求参数
//     * @return
//     */
//    public ApiResponse syncRequest(String httpMethod, String apiName, Map<String, String> params) {
//        HttpUriRequest httpRequest = this.getHttpRequest(httpMethod, apiName, params);
//
//        try {
//            CloseableHttpResponse httpResponse = this.getHttpClient().execute(httpRequest);
//            return this.parseToApiResponse(httpResponse);
//        } catch (ClientProtocolException e) {
//            e.printStackTrace();
//        } catch (IOException e) {
//            e.printStackTrace();
//        }
//        return null;
//    }
//
//    /**
//     * getHttpRequest：(生成http请求)
//     *
//     * @author
//     * @param httpMethod POST
//     * @param apiName /getUserByUserId
//     * @return
//     */
//    private HttpUriRequest getHttpRequest(String httpMethod, String apiName,
//                                          Map<String, String> params) {
//        RequestBuilder builder = RequestBuilder.create(httpMethod);
//        EntityBuilder bodyBuilder = EntityBuilder.create();
//        // 请求头，写死
//        bodyBuilder.setContentType(ContentType.parse("application/json; charset=UTF-8"));
//        // 设置请求地址
//        URI uri = this.buildUri(apiName, params);
//        builder.setUri(uri);
//
//        // 添加请求参数
//        if (!CollectionUtils.isEmpty(params)) {
//            List<NameValuePair> paramList = new ArrayList<NameValuePair>();
//            for (Entry<String, String> entry : params.entrySet()) {
//                paramList.add(new BasicNameValuePair(entry.getKey(), entry.getValue()));
//            }
//
//            bodyBuilder.setParameters(paramList);
//        }
//
//        builder.setEntity(bodyBuilder.build());
//
//        // 设置请求头
//        this.setHead(builder, uri);
//
//        builder.setCharset(Charset.forName("UTF-8"));
//        return builder.build();
//    }
//
//    /**
//     * setHead：(设置请求头)
//     *
//     * @author
//     * @param builder
//     * @param uri
//     */
//    private void setHead(RequestBuilder builder, URI uri) {
//        // 时间戳
//        String authTimestamp = System.currentTimeMillis() + "";
//        String authNonce = UUID.randomUUID().toString();
//        // 默认RELEASE
//        builder.addHeader("S-Auth-Stage", Native2AsciiUtils.native2Ascii("RELEASE"));
//        // 应用id，创建应用时分配的，可在应用管理中的概况获取
//        builder.addHeader("S-Auth-AppId", Native2AsciiUtils.native2Ascii(authAppId));
//        builder.addHeader("S-Auth-Timestamp", Native2AsciiUtils.native2Ascii(authTimestamp));
//        builder.addHeader("S-Auth-Nonce", Native2AsciiUtils.native2Ascii(authNonce));
//        // 默认 1
////        builder.addHeader("S-Auth-Version", Native2AsciiUtils.native2Ascii("1"));
//        // 默认写死
//        builder.addHeader("User-Agent", Native2AsciiUtils.native2Ascii("ShieldJavaSDK"));
//
//        // 请求签名
//        String sign = signRequest(authNonce, authTimestamp, authAppId, null, uri);
//        builder.addHeader("S-Auth-Signature", Native2AsciiUtils.native2Ascii(sign));
//    }
//
//    private String signRequest(String authNonce, String authTimestamp, String authAppId,
//                               String contentMD5, URI uri) {
//        String url = uri.getRawPath();
//        if (StringUtils.isNotBlank(uri.getRawQuery())) {
//            url = url + "?" + uri.getRawQuery();
//        }
//        String signature =
//                this.sign(authAppSecret, url, null, authNonce, authTimestamp, authAppId, contentMD5);
//
//        return signature;
//    }
//
//    /**
//     * sign：(生成请求的签名)
//     *
//     * @author
//     * @param secret 应用appscret，创建应用时提供，可在应用管理的概况中获取
//     * @param url 请求接口地址
//     * @param authRandomKey 加密传输时才需要，目前传null
//     * @param authNonce uuid生成的随机数
//     * @param authTimestamp 当前的时间戳
//     * @param authAppId 应用appId,创建应用时提供，可在应用管理的概况中获取
//     * @param contentMD5 有请求体时才传，当前传null
//     * @return
//     */
//    private String sign(String secret, String url, String authRandomKey, String authNonce,
//                        String authTimestamp, String authAppId, String contentMD5) {
//        try {
//            String[] values = new String[6];
//            values[0] = url;
//            values[1] = authRandomKey;
//            values[2] = authNonce;
//            values[3] = authTimestamp;
//            values[4] = authAppId;
//            values[5] = contentMD5;
//
//            String stringToSign = buildStringToSign(values);
//            Mac hmacSha256 = Mac.getInstance("HmacSHA256");
//            byte[] keyBytes = secret.getBytes("UTF-8");
//            hmacSha256.init(new SecretKeySpec(keyBytes, 0, keyBytes.length, "HmacSHA256"));
//            return Base64.encodeBase64String(hmacSha256.doFinal(stringToSign.getBytes("UTF-8")));
//        } catch (Exception e) {
//            throw new RuntimeException(e);
//        }
//    }
//
//    private String buildStringToSign(String[] headValues) {
//        StringBuilder sb = new StringBuilder();
//        for (int i = 0; i < headValues.length; i++) {
//            if (StringUtils.isNotEmpty(headValues[i])) {
//                sb.append(headValues[i]).append("|");
//            }
//        }
//        String stringToSign = sb.substring(0, sb.lastIndexOf("|"));
//        return stringToSign;
//    }
//
//    /**
//     * buildUri：(组装请求的地址)
//     *
//     * @author
//     * @param apiName
//     * @return
//     */
//    private URI buildUri(String apiName, Map<String, String> params) {
//        try {
//            URIBuilder uriBuilder = new URIBuilder();
//            uriBuilder.setScheme("http");
//            uriBuilder.setHost(host);
//            uriBuilder.setPath(apiName);
//            uriBuilder.setPort(port);
//
//            if (!CollectionUtils.isEmpty(params)) {
//                for (Entry<String, String> entry : params.entrySet()) {
//                    uriBuilder.addParameter(entry.getKey(), entry.getValue());
//                }
//            }
//
//            return uriBuilder.build();
//        } catch (URISyntaxException e) {
//            throw new SdkClientException("build http request uri failed", e);
//        }
//    }
//
//    /**
//     * parseToApiResponse：(组装返回值)
//     *
//     * @author
//     * @param httpResponse
//     * @return
//     * @throws IOException
//     */
//    private ApiResponse parseToApiResponse(HttpResponse httpResponse) throws IOException {
//        ApiResponse result = new ApiResponse();
//
//        result.setStatusCode(httpResponse.getStatusLine().getStatusCode());
//        Header contentType;
//        if (httpResponse.getEntity() != null) {
//            contentType = httpResponse.getEntity().getContentType();
//            if (contentType != null) {
//                result.setContentType(contentType.getValue());
//            }
//            result.setBody(EntityUtils.toByteArray(httpResponse.getEntity()));
//        } else {
//            contentType = httpResponse.getFirstHeader("Content-Type");
//            result.setContentType(contentType.getValue());
//        }
//        result.setHeaders(new HashMap());
//        for (Header header : httpResponse.getAllHeaders()) {
//            result.getHeaders().put(header.getName(), header.getValue());
//        }
//        result.setStatusReasonPhrase(httpResponse.getStatusLine().getReasonPhrase());
//
//        return result;
//    }
//
//    public static void main(String[] args) {
//        RequestTest test = new RequestTest();
//        Map<String, String> params = new HashMap<String, String>();
//        params.put("userId", "xxxx");
//        ApiResponse apiResponse = test.syncRequest("POST", "/getUserByUserId", params);
//
//        try {
//            System.out.println(new String(apiResponse.getBody(), "UTF-8"));
//        } catch (UnsupportedEncodingException e) {
//            e.printStackTrace();
//        }
//    }
//
//}